package pt.isel.lercm.projectmanager.spring.model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name="ALUNO")
public class Aluno {
	
	private int id;
	private String nome;
	private String numero;
	private Grupo grupo;
	private AnoLectivo anoLectivo;
	private String userGitHub;
	private String userRedmine;
	private boolean confirmado;
	private boolean hasGithub;
	private boolean hasRedmine;
	private String email;
	private GrupoGithub grupoGithub;
	private GrupoRedmine grupoRedmine;
	private Integer idRedmine;
	
	@Id
	@SequenceGenerator(name="ID_GENERATOR", sequenceName="hibernate_sequence", allocationSize=1)  
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ID_GENERATOR")  
	@Column(name="ID", unique = true, nullable = false)
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	@Column(name="NOME", nullable = true)
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	@Column(name="NUMERO", nullable = true)
	public String getNumero() {
		return numero;
	}
	public void setNumero(String numero) {
		this.numero = numero;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "GRUPO_ID")
	public Grupo getGrupo() {
		return grupo;
	}
	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "ANO_ID")
	public AnoLectivo getAnoLectivo() {
		return anoLectivo;
	}
	public void setAnoLectivo(AnoLectivo anoLectivo) {
		this.anoLectivo = anoLectivo;
	}
	
	@Column(name="USER_GITHUB", nullable = true)
	public String getUserGitHub() {
		return userGitHub;
	}
	public void setUserGitHub(String userGitHub) {
		this.userGitHub = userGitHub;
	}
	
	@Column(name="USER_REDMINE", nullable = true)
	public String getUserRedmine() {
		return userRedmine;
	}
	public void setUserRedmine(String userRedmine) {
		this.userRedmine = userRedmine;
	}
	
	@Column(name="CONFIRMADO", nullable = true)
	public boolean isConfirmado() {
		return confirmado;
	}
	public void setConfirmado(boolean confirmado) {
		this.confirmado = confirmado;
	}
	
	@Column(name="HAS_GITHUB", nullable = true)
	public boolean isHasGithub() {
		return hasGithub;
	}
	public void setHasGithub(boolean hasGithub) {
		this.hasGithub = hasGithub;
	}
	
	@Column(name="HAS_REDMINE", nullable = true)
	public boolean isHasRedmine() {
		return hasRedmine;
	}
	public void setHasRedmine(boolean hasRedmine) {
		this.hasRedmine = hasRedmine;
	}
	
	@Column(name="EMAIL", nullable = true)
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "GRUPO_GIT_ID")
	public GrupoGithub getGrupoGithub() {
		return grupoGithub;
	}
	public void setGrupoGithub(GrupoGithub grupoGithub) {
		this.grupoGithub = grupoGithub;
	}
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "GRUPO_REDMINE_ID")
	public GrupoRedmine getGrupoRedmine() {
		return grupoRedmine;
	}
	public void setGrupoRedmine(GrupoRedmine grupoRedmine) {
		this.grupoRedmine = grupoRedmine;
	}

	@Column(name="ID_REDMINE", nullable = true)
	public Integer getIdRedmine() {
		return idRedmine;
	}
	
	public void setIdRedmine(Integer idRedmine) {
		this.idRedmine = idRedmine;
	}
	
	@Transient
	public boolean isNew(){
		return id == 0;
	}
	
	@Transient
	public boolean equals(Object obj){
		if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof Aluno))
            return false;

        Aluno rhs = (Aluno) obj;
        
        return rhs.getId() == this.id;
	}
}
